/*************************************************************
* Strip Packing Problem
* 
*
* */
#ifndef DISPERSA_H
#define DISPERSA_H

#include <vector>
#include <set>

#include "solucion.h"
#include "rectangulo.h"
#include "heuristica.h"
#include "contenedor.h"

#define N_POBLACION 100
#define N_REFSET 10
#define N_SUBSET 2

using namespace std;

class Dispersa: public Heuristica {
private:
	vector <Solucion> poblacion;
	vector <pair<Solucion, bool> > refset;

	set <set <Solucion> > subset;
	set <set <Solucion> > oldset;

	vector <Solucion> combinacion;

	Contenedor C;
	
public:
	Dispersa();
	Dispersa(list<Rectangulo> lista_in, Contenedor C_);

	~Dispersa();
	
	list<Rectangulo> generaInicial();
	list<Rectangulo> mejoraSolucion();

private:
	bool paradaInterno();
	bool paradaIntermedio();

	void crearPoblacion();
	void crearRefSet();
	void crearSubSet();
	
	void combinarSoluciones();
	void mejorarSoluciones();
	void actualizarRefSet();

	Solucion busquedaLocal(Solucion);
	int distancia (Solucion a, Solucion b);
	list <Rectangulo> branchBound(list <Rectangulo> init, list <Rectangulo> candidatos, int& minAltura);

	void recursiveSubSet(set <Solucion>& tmp, vector <pair <Solucion, bool> >& cand, const int& level, const int& maxLevel);
};

#endif

